
let numArr = [11, 223, 43, 123, 10, 2, 4];

// 需求1: 取出所有小于100的数字
let newNumArr = numArr.filter(function (item) {
  // filter高阶函数
  // 参数: 将函数作为参数传递，将数组内的值作为此函数的参数;
  // 返回: 新数组，回调函数有一个要求，必须返回一个boolean值，为真时添加至新数组，为假时过滤此次处理。
  return item < 100;
})

console.log("看看 小于100的数组", newNumArr);

// 需求2: 将所有小于100的数字进行转化，全部乘以2
let newNumArr2 = newNumArr.map(function (item) {
  // map高阶函数
  // 参数: 将函数作为参数传递，将数组内的值作为此函数的参数;
  // 返回: 新数组，操作数组内所有元素，可以根据条件改变此值，最终返回一个由内部元素改变后组成的新数组。
  return item * 2;
})

console.log("数组内部元素全部乘以2", newNumArr2);

// 需求3：将新数组内部所有数据相加，得到一个最终值
let total = newNumArr2.reduce(function (prevNum, item) {
  // reduce高阶函数
  // 参数: 两个参数
  //  参数1为一个函数，此函数可接收两个参数，第一个是上一个函数返回值，一个是数组内的元素;
  //  参数2为上一次函数返回值的默认值设置。
  // 返回: 循环结束后最后一次返回的结果
  console.log("上一个值", prevNum, "当前值", item);
  return item + prevNum;
}, 0)

console.log("最终值为", total);


// 通过高阶函数一次写完所有需求
let newTotal = numArr.filter(function (n) {
  return n < 100;
}).map(function (n) {
  return n * 2;
}).reduce(function (prev, n) {
  return prev + n;
}, 0);

// 通过箭头函数简化, 一行代码！！！
let newTotal2 = numArr.filter(n => n < 100).map(n => n * 2).reduce((prev, n) => prev + n, 0);

console.log("一次完成的结果计算", newTotal);
console.log("一行代码的结果计算", newTotal2);